#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <typecomm.h>
#include <logbase.h>

/*
数组与元素。
数组与指针操作目标内存时，语法都是一样的。
*/

struct myCheckStc
{
    uint16_t vals;
    uint32_t vali;
};

int main(int argc, char **argv)
{
#define MY_CHECK_BUF_LEN 2
    struct myCheckStc tmparr[MY_CHECK_BUF_LEN];
    struct myCheckStc *tmpptr = tmparr;
    // 操作tmparr的连续内存，可以通过数组tmparr或tmpptr，并且他们操作方法一致。
    // tmparr的值虽然没有空间保持，但他类型如：const struct myCheckStc *
    // tmpptr 类型很明确： struct myCheckStc *
    // &tmparr[1]，取数组第一个元素的地址，&tmparr[1]的类型如：const struct myCheckStc *
    // tmparr + 1，也取数组第一个元素的地址，类型如：const struct myCheckStc *
    // tmparr[1]是第一个元素，类型：struct myCheckStc
    // *(tmparr+1)是第一个元素，类型：struct myCheckStc
    #define MY_OPT_PTR tmpptr
    for (int i = 0; i < MY_CHECK_BUF_LEN; i++)
    {
        MY_OPT_PTR[i].vals = i;
        MY_OPT_PTR[i].vali = 1 + MY_OPT_PTR[i].vals;
    }
    for (int i = 0; i < MY_CHECK_BUF_LEN; i++)
    {
        logdebugc("it's [%d] element!", i);
        // 取元素首地址。结构体指针类型，struct myCheckStc*
        logdebugc("get ptr1:%p", &MY_OPT_PTR[i]);
        // 取元素第一个成员首地址。short指针类型，short *
        logdebugc("get ptr2:%p", &MY_OPT_PTR[i].vals);
        // 地址+i，获得i个元素首地址。
        logdebugc("get ptr3:%p", MY_OPT_PTR + i);
        // 获得元素成员。
        logdebugc("print val1:%d,%d", MY_OPT_PTR[i].vals, MY_OPT_PTR[i].vali);
        logdebugc("print val2:%d,%d", (MY_OPT_PTR + i)->vals, (MY_OPT_PTR + i)->vali);
        logdebugc("print val3:%d,%d", (*(MY_OPT_PTR + i)).vals, (*(MY_OPT_PTR + i)).vali);
    }
    return 1;
}
